package persistencia;

import java.util.Calendar;
import java.util.Date;

public class Emprestimo{

	//Referencias da Agregacao/Composicao 
	private Livro   livroEmprestimo;
	private Usuario usuarioEmprestimo;
	
	//Variaveis locais
	private Date dataEmprestimo							= null;
	private Date dataPrevisaoDevolucao					= null;
	private Date dataDevolucao							= null;
	private final static double TAXA_REFERENCIA_MULTA	= 0.30;
	private final static int    DIAS_EMPRESTIMO 		= 7;

	//--------------------------------------------------
	// Construtores
	//--------------------------------------------------
	public Emprestimo() {

	}
	
	public Emprestimo(Usuario usuarioEmprestimo, Livro livroEmprestimo){
		
		this.setUsuarioEmprestimo(usuarioEmprestimo);
		this.setLivroEmprestimo(livroEmprestimo);
	}
	//--------------------------------------------------
	// Métodos get
	//--------------------------------------------------
	public Date getDataEmprestimo() {
		return dataEmprestimo;
	}
	
	public Date getDataDevolucao() {
		return dataDevolucao;
	}
	
	public Date getDataPrevisao() {
		return dataPrevisaoDevolucao;
	}

	public Usuario getUsuarioEmprestimo() {
		return usuarioEmprestimo;
	}
	
	public Livro getLivroEmprestimo() {
		return livroEmprestimo;
	}
	
	//--------------------------------------------------
	// Métodos set
	//--------------------------------------------------
	public void setDataEmprestimo(Date dataEmprestimo) {
		this.dataEmprestimo = dataEmprestimo;
	}
	
	public void setDataDevolucao(Date dataDevolucao) {
		this.dataDevolucao = dataDevolucao; 
	}
	
	public void setDataPrevisao(Date dataPrevisaoDevolucao) {
		this.dataPrevisaoDevolucao = dataPrevisaoDevolucao;
	}
	
	public void setLivroEmprestimo(Livro livroEmprestimo) {
		this.livroEmprestimo = livroEmprestimo;
	}
	
	public void setUsuarioEmprestimo(Usuario usuarioEmprestimo) {
		this.usuarioEmprestimo = usuarioEmprestimo;
	}
	
	//--------------------------------------------------
	// Metodos de acao do emprestimo
	//--------------------------------------------------
	// TODO: Esses métodos não deveriam estar na Regra de Negócios?
	// Aí algumas informações como DIAS_EMPRESTIMO estariam no construtor,
	// para que todas as vezes que o objeto Emprestimo fosse chamado, já
	// levasse consigo as informações necessárias...
	public static Date calculaDataPrevisaoDevolucao(Date dataEmprestimo) {
		
		Date dataPrevisaoDevolucao	= null;;
		Calendar cal				= Calendar.getInstance();
		
		cal.setTime(dataEmprestimo);
		cal.add(Calendar.DATE, +DIAS_EMPRESTIMO);
		dataPrevisaoDevolucao	= cal.getTime();

		return dataPrevisaoDevolucao;

	}
	
	public static double calcularMulta(Emprestimo emprestimo) {

		double valorMulta = 0.0;
		long diferencaMili, diferencaDias = 0;
		int tempoDia = 1000 * 60 * 60 * 24;
		
		Calendar devolucao = Calendar.getInstance();
		Calendar previsao  = Calendar.getInstance();

		devolucao.setTime( emprestimo.getDataDevolucao() );
		previsao.setTime( emprestimo.getDataPrevisao() );
		
		diferencaMili	= devolucao.getTimeInMillis() - previsao.getTimeInMillis();
		diferencaDias	= diferencaMili / tempoDia;
		
		if ( diferencaDias > DIAS_EMPRESTIMO ){
			valorMulta = TAXA_REFERENCIA_MULTA * diferencaDias;
		}

		return valorMulta;
	}
}